<?php
declare (strict_types = 1);

namespace app\adminapi\controller;

use app\admin\model\SpecValue;
use app\adminapi\business\TypeBusiness;
use app\common\model\Attribute;
use app\common\model\Spec;
use think\exception\HttpException;
use think\exception\ValidateException;
use think\Request;

/**
 * 模型有关接口
 * Class Type
 * @package app\adminapi\controller
 */
class Type
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index()
    {

        try {
            $name = \request()->get('name');
            $where = [];
            if (!empty($name)) {
                $where[] = [
                    "type_name",'LIKE',"%$name%"
                ];
            }
            # 分页查询数据
            $data = \app\common\model\Type::where($where)->paginate(3);
            return success($data);

        }catch (ValidateException $validateException) {
            return  fail($validateException->getCode(),$validateException->getError());
        }

    }

    /**
     * 显示创建资源表单页.
     *
     * @return \think\Response
     */
    public function create()
    {
        //
    }

    /**
     * 保存新建的资源
     * 1、观察表单传参格式
     * 2、模拟表单传递格式
     * 3、数据验证、过滤 后期 测试/自己发现
     * 4、 构造数据入库 （事务） type spec specValue attribute
     * 添加一条（create）批量添加 saveAll 返回的是结果集对象
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
        $param = $request->all();
        $param = [
            'type_name' => "手机",// type表
            'spec' => [//spec表和spec_value表
                ['name' => "颜色", 'sort' => 1, 'value' => ['星光色','午夜色','粉色'],],
                ['name' => "        ", 'sort' => 1, 'value' => ['官方版','旗舰版'],],// 缺少数据、脏数据 没有规格名、但是有规格值
                ['name' => "版本", 'sort' => 1, 'value' => [' ',' '],],// 缺少数据、脏数据 没有规格值、但是有规格名
                ['name' => "版本", 'sort' => 1, 'value' => ['V2',' '],],// 缺少数据、脏数据 没有规格值、但是有规格名
                [
                    'name' => "内存", 'sort' => 2, 'value' => ['128G','256G','512G'],
                ],
            ],
            'attr' => [// attribute表 属性的信息
                ['name' => "产地", 'sort' => 1, 'value' => ['中国大陆','香港'],],
                ['name' => "分辨率", 'sort' => 1, 'value' => ['',''],],//缺少数据、脏数据 有属性名 没有属性值
                ['name' => "", 'sort' => 1, 'value' => ['IOS'],],//缺少数据、脏数据 有属性值 没有属性名
                [
                    'name' => "重量", 'sort' => 1, 'value' => ['320G'],
                ],
            ],
        ];

        # 进行入库、在业务逻辑层进行处理
        try {

            # 参数验证 spec type_name attr
            validate(['type_name' => 'require','spec' => 'require|array','attr' => 'require|array'])->check($param);

            // 第一次 没有优化过
            # 对规格名、和规格值、进行处理 过滤
//            foreach ($param['spec'] as $key => $value) {
//                // 过滤掉规格名为空的数据
//                if (empty(trim($value['name']))) {
//                    // 过滤掉当前的这一条数据
//                    unset($param['spec'][$key]);// 直接删除这一条记录、不再处理
////                    ['name' => "", 'sort' => 1, 'value' => ['官方版','旗舰版'],],// 缺少数据、脏数据 没有规格名、但是有规格值
//                    continue;//没有规格名、规格值就不需要处理
//                }
//                // 过滤掉规格值为空
//                foreach ($value['value'] as $k => $item) {
//                    if (empty(trim($item))) {
////                        unset($item);// 错误用 法销毁变量
////                        unset($value['value'][$k]);// 错误用法 销毁的变量
//                        unset($param['spec'][$key]['value'][$k]);
//                    }
//                }
//                // 再次进行验证 没有值 规格值多个
////                if (count($value['value']) <= 0) { 错误的
//                if (count($param['spec'][$key]['value']) <= 0) {
//                    unset($param['spec'][$key]);
//                }
//            }
//
//            // 属性名、属性值、、进行处理 过滤
//            foreach ($param['attr'] as $key => $value) {
//                // 过滤掉规格名为空的数据
//                if (empty(trim($value['name']))) {
//                    // 过滤掉当前的这一条数据
//                    unset($param['attr'][$key]);// 直接删除这一条记录、不再处理
////                    ['name' => "", 'sort' => 1, 'value' => ['官方版','旗舰版'],],// 缺少数据、脏数据 没有规格名、但是有规格值
//                    continue;//没有规格名、规格值就不需要处理
//                }
//                // 过滤掉规格值为空
//                foreach ($value['value'] as $k => $item) {
//                    if (empty(trim($item))) {
////                        unset($item);// 错误用 法销毁变量
////                        unset($value['value'][$k]);// 错误用法 销毁的变量
//                        unset($param['attr'][$key]['value'][$k]);
//                    }
//                }
//                // 再次进行验证 没有值 规格值多个
////                if (count($value['value']) <= 0) { 错误的
//                if (count($param['attr'][$key]['value']) <= 0) {
//                    unset($param['attr'][$key]);
//                }
//            }

            // 进行优化、观察代码异同地方

//            1、第一次过滤规格名、规格值
            $param = filter_data($param,'spec');

            if (count($param['spec']) <= 0) {
                abort(2001,'没有规格信息、请完成规格信息');
            }
//            2、第一次过滤属性名、属性值
            $param = filter_data($param,'attr');
            if (count($param['attr']) <= 0) {
                abort(2001,'没有属性信息、请完成属性信息');
            }
            # 入库
            $result = TypeBusiness::addType($param);
            return  success($result);

        }catch (ValidateException $validateException) {
            return  fail($validateException->getCode(),$validateException->getError());
        }catch (HttpException $httpException) {
            return  fail($httpException->getCode(),$httpException->getMessage());
        }

    }

    /**
     * 详情的接口
     * 显示指定的资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function read($id)
    {
        try {

            # 接收参数
            if (!is_numeric($id)) {
                abort(2001,'模型id参数不正确');
            }
            
            $info = \app\common\model\Type::with(['attr','spec','spec.specValue'])->find($id)->toArray();


            return  success($info);

        }catch (ValidateException $validateException) {
            return  fail($validateException->getCode(),$validateException->getError());
        }catch (HttpException $httpException) {
            return  fail($httpException->getStatusCode(),$httpException->getMessage());
        }
    }

    /**
     * 显示编辑资源表单页.
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * 保存更新的资源
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update(Request $request, $id)
    {
        /**
         * 更新的流程
         * 更新类型 id
         * 更新规格名
         * 删除原来的规格名、添加新的规格数据
         */
        $param = \request()->all();

        # 验证参数 事务
//        。。。
        // 更新模型 buinsess
        \app\common\model\Type::update(['type_name' => $param['type_name']]);
        // 更新规格名
        Spec::where('type_id',$param['type_id'])->delete();// 强制删除
        $param = filter_data($param,'spec');
        Spec::saveAll($specData);

        // 更新规格值
        SpecValue::where('type_id',$param['type_id'])->delete();// 强制删除
        SpecValue::saveAll($specValueData);

        // 更新属性值
        Attribute::where('type_id',$param['type_id'])->delete();
        $param = filter_data($param,'attr');
        Attribute::savaAll($attrData);
    }

    /**
     * 删除指定资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function delete($id)
    {
        try {

            # 删除的接口

            # 接收参数
            if (!is_numeric($id)) {
                abort(2001,'模型id参数不正确');
            }
            # 删除数据
            $result = TypeBusiness::delete($id);

            return  success($result);

        }catch (ValidateException $validateException) {
            return  fail($validateException->getCode(),$validateException->getMessage());
        }catch (HttpException $httpException) {
            return  fail($httpException->getStatusCode(),$httpException->getMessage());
        }
    }
}

